/* eslint-disable camelcase */
"use strict";
//
// The following are the callbacks that can be passed to createHook().
//

// init() is called during object construction. The resource may not have
// completed construction when this callback runs. Therefore, all fields of the
// resource referenced by "asyncId" may not have been populated.
/**
 * @type {import('async_hooks').HookCallbacks['init']}
 */
const init = (asyncId, type, triggerAsyncId, resource) => {};

// before() is called just before the resource's callback is called. It can be
// called 0-N times for handles (such as TCPWrap), and will be called exactly 1
// time for requests (such as FSReqCallback).
/**
 * @param {number} asyncId
 * @type {import('async_hooks').HookCallbacks['before']}
 */
const before = (asyncId) => {};

// after() is called just after the resource's callback has finished.
/**
 * @param {number} asyncId
 * @type {import('async_hooks').HookCallbacks['after']}
 */
const after = (asyncId) => {};

// destroy() is called when the resource is destroyed.
/**
 * @param {number} asyncId
 * @type {import('async_hooks').HookCallbacks['destroy']}
 */
const destroy = (asyncId) => {};

// promiseResolve() is called only for promise resources, when the
// resolve() function passed to the Promise constructor is invoked
// (either directly or through other means of resolving a promise).
/**
 * @type {import('async_hooks').HookCallbacks['promiseResolve']}
 */
const promiseResolve = (asyncId) => {};

/// ///////////////////////////////////////////////////////////////
//
/// ///////////////////////////////////////////////////////////////
const async_hooks = require("node:async_hooks");

// Return the ID of the current execution context.
const eid = async_hooks.executionAsyncId();

// Return the ID of the handle responsible for triggering the callback of the
// current execution scope to call.
const tid = async_hooks.triggerAsyncId();

// Create a new AsyncHook instance. All of these callbacks are optional.
const asyncHook = async_hooks.createHook({
  init,
  before,
  after,
  destroy,
  promiseResolve,
});

// Allow callbacks of this AsyncHook instance to call. This is not an implicit
// action after running the constructor, and must be explicitly run to begin
// executing callbacks.
asyncHook.enable();

// Disable listening for new asynchronous events.
asyncHook.disable();
